package com.uetoken.cn.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

public class ArithUtils {

    /**
     * 合计
     *
     * @param value1 转账金额
     * @param value2 汇率
     * @param scale  精确范围
     * @return 两个参数的积
     */
    public static String add(String value1, String value2, int scale) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.add(b2).setScale(scale, RoundingMode.UP).toPlainString();
    }

    /**
     * 提供精确减法运算的sub方法
     *
     * @param value1 被减数
     * @param value2 减数
     * @param scale  精确范围
     * @return 两个参数的差
     */
    public static String subtract(String value1, String value2, int scale) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.subtract(b2).toPlainString();
    }

    /**
     * 提供精确乘法运算的mul方法
     *
     * @param value1 转账金额
     * @param value2 汇率
     * @param value3 服务费率
     * @param scale  精确范围
     * @return 两个参数的积
     */
    public static String serviceCharge(String value1, String value2, String value3, int scale) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        BigDecimal b3 = new BigDecimal(value3);
        return b1.multiply(b2).multiply(b3).setScale(scale, RoundingMode.UP).toPlainString();
    }

    /**
     * 提供精确乘法运算的mul方法
     *
     * @param value1 转账金额
     * @param value2 汇率
     * @param value3 服务费率
     * @param value4 换算成DOS占比
     * @param scale  精确范围
     * @return 两个参数的积
     */
    public static String serviceChargeDOS(String value1, String value2, String value3, String value4, int scale) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        BigDecimal b3 = new BigDecimal(value3);
        BigDecimal b4 = new BigDecimal(value4);
        return "￥" + b1.multiply(b2).multiply(b3).divide(b4, scale, RoundingMode.UP).toPlainString() + "DOS";
    }

    /**
     * 百分比
     *
     * @param value1 数
     * @param scale  精确范围
     * @return 两个参数的积
     */
    public static String percent(String value1, int scale) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(100);
        return b1.multiply(b2).stripTrailingZeros().toPlainString() + "%";
    }

    /**
     * 比较大小
     *
     * @param v1 被比较数
     * @param v2 比较数
     * @return 如果v1 ＞ v2 则 返回 1 ；如果v1 == v2 则 返回 0；如果v1 ＜ v2 则 返回 -1
     */
    public static int compare(String v1, String v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        int bj = b1.compareTo(b2);
        return bj;
    }

    /**
     * 数字不足位数前后补0
     *
     * @param num   参与补零的数字
     * @param scale 最终位数长度
     * @return
     */
    public static String zeroFormat(String num, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The   scale   must   be   a   positive   integer   or   zero");
        }
        if (scale == 0) {
            return new DecimalFormat("0").format(num);
        }
        String formatStr = "0.";
        for (int i = 0; i < scale; i++) {
            formatStr = formatStr + "0";
        }
        return new DecimalFormat(formatStr).format(Double.parseDouble(num));
    }
}
